<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ES6</title>
</head>

<body>
    <script>

        console.log('ES6作用域{}');

        try {
            let c = 'c';
            //ES6作用域
            {
                var a = 'a';
                let b = 'b';
                //在作用域内，在变量定义前是处于TDZ（暂时性死去）状态，不能使用变量，也不会读取父级作用域变量。
                //如果子作用域内没定义与父级相同名称的变量，则会去父级找是否定义了变量。
                // console.log(c);
                let c = 'cc';
                //这里优先输出 函数执行所在作用域定义的变量。
                console.log(c);
            }
            console.log(a);
            //无法访问 b
            console.log(b);
        } catch (e) {
            console.log(e)
        }


        console.log('ES6作用域 for ');
        for (let index = 0; index < 10; index++) {
            //局部变量暂时性死去（TDZ）开始
            // 在此区间无法使用 index ，并不会输出 for循环定义的 index
            // console.log(index);
            //局部变量暂时性死去（TDZ）结束
            let index = 'abc';
            console.log(index);
        }

        console.log('ES6解构赋值 for ');
        //解构赋值，数组基本语法，可以设置默认值，如果返回的是undefined，就会被默认值替换，null不会被默认值替换。
        let [aa, bb, cc, dd, ee = 5] = [1, 2, 3, 4];
        console.log('数组解构赋值：', aa, bb, cc, dd, ee);

        let json = {
            name: '张三',
            age: 18,
            job: '码农',
            card: [{
                bank: 'bankname',
                num: 'cardnum'
            }, {
                bank: 'bankname1',
                num: 'cardnum1'
            }]
        }
        //解构赋值，对象基本语法，可以设置默认值，如果返回的是undefined，就会被默认值替换，null不会被默认值替换。
        let { name: x, age: y, job, card, address = 'china' } = json;
        console.log('对象解构赋值：', x, y, job, card, address);

        let [xx, yy, zz = 'undef', jj = 'is null'] = ['xx', 'yy', undefined, null];
        //undefined 可以被替换，但 null 不可以被替换。
        console.log('对象解构赋值,测试默认值：', xx, yy, zz, jj);
        // 定义和赋值分开时，赋值时需要用 （） 括上才可以，否则会报语法错误。
        let aaa;
        ({ aaa } = { a: 'apple', b: 'banana' });

        // 解构赋值实现交换两个数
        let numa = 12;
        let numb = 5;
        console.log('赋值前：', numa, numb);
        [numa, numb] = [numb, numa];
        console.log('赋值后：', numa, numb);

        // 解构赋值 - 函数传参解构 -- 返回值解构
        function calc({ a, b }) {
            return { a: a, b: b, c: a * b };
        }
        let { a: a1, b: b1, c: c1 } = calc({ a: 2, b: 3 });
        console.log('函数返回：', a1, b1, c1);






    </script>


</body>

</html>